package com.beidasoft.flip.webframe.service;

import java.lang.reflect.Field;
import java.util.Arrays;

import javax.persistence.Id;

import org.springframework.lang.NonNull;

import com.beidasoft.flip.webframe.core.pojo.DO;
import com.beidasoft.flip.webframe.core.pojo.DTO;
import com.beidasoft.flip.webframe.core.repository.FlipJpaRepository;
import com.beidasoft.flip.webframe.core.util.CommonUtil;

/**
 * 基础接口
* @author 肖翔
* @date 2020/01/02
*/
public interface FlipService {

    /**
     * <p>新增或者更新的公用方法</p>
     * @param <M>
     * @param <T>
     * @param <ID>
     * @param m DTO对象
     * @param id 主键
     * @param dao dao层
     * @param tClass DO对象的class
     * @return
     */
    default <M extends DTO, T extends DO, ID> T getAddOrUpdateEntity(@NonNull M m, @NonNull ID id,
        @NonNull FlipJpaRepository<T, ID> dao, @NonNull Class<T> tClass) {
        boolean isExist = false;//是否存在的状态位
        if (id != null) {
            isExist = dao.existsById(id);
        }
        //判断id是否存在
        if (isExist) {
            //如果存在的话就更新
            T oldEntity = dao.findById(id).get();
            CommonUtil.copyPropeyties(m, oldEntity);
            return oldEntity;
        } else {
            //获取T的主键
            Field[] allfields = tClass.getDeclaredFields();
            String idName = Arrays.asList(allfields).stream().filter(f -> {
                return f.getAnnotation(Id.class) != null ? true : false;//找到有Id注解的那个域
            }).findFirst().get().getName();
            T entity = CommonUtil.copyPropeyties(m, CommonUtil.newInstance(tClass));//复制所有域的值
            //如果主键为空的话
            if (id == null || id.equals("")) {
                CommonUtil.setPrivateField(idName, CommonUtil.newUuid(), entity);
            }
            return entity;
        }
    }

}
